LangChain の LCEL
雰囲気で使えるじゃろ、と使ってみたが、チュートリアルを一歩でるとまじわからん、となったのでコードとか読む。なおLangChain は 0.1.0 時点。
オフィシャルドキュメント見てチュートリアルをやってみる
便利そうだが覚える事がそこそこありそうだ
debug メモ
set_debug や langsmith のお話
chain.input_schema.schema()
chain.output_schema.schema()
スルーはRunnablePassthrough
並列は RunnableParallel
ルーティングは RunnableBranch
これでどんな処理をやらせるかをfunction calling 的な実行で任せられる
bind()で、入力バトンじゃなくて無理やりbind可能
tools / fuction_call なども bind すると便利だよ、的な
chain 実行時にchain内部の設定を変える
configurable_fields / configurable_alternatives
@chain デコレータ
簡単に関数を runnable 化したい時とか
名前のトレースがしにくくdebug がわかりにくそうなので、ちゃんと実装する時はクラス作った方が良い気がしている
with_fallbacks
例外が起きたら別の runnable に差し替える
generator で stream
chain の実行グラフを表示, debug で便利そう
chain.get_graph().print_ascii()
chain.get_prompts()
RunnableWithMessageHistory を使ってのメッセージ履歴(memory)
cookbook に例が色々
RAG + 継続チャット
embeddings を使っての routing
function calling ではなく、embeddings 類似性で選択を決定する例
LCEL + memory 追加の話
----
ここからコード読む
LCEL の magic method の | の挙動
__or__ __ror__ が呼び出される。rorはorがなかったときに代替される
ので foo | chain も chain | foo もどちらでも書ける(chain(Runnable) がor, ror実装してるので)
戻り値はRunnableSequenceとなる
片方の値はcoerce_to_runnableでラップされる。上の例ならfooがcoerce_to_runnable(foo)になる。
キモのcoerce_to_runnable とはなんであるか
Runnable なら何もしないで返す
generator, async generator, イテレータなら、RunnableGenerator でラップする
callable(functionとか)なら、RunnableLambdaでラップする
dict なら、RunnableParallelでラップする
うおー、なるほど。
RunnableLambda or @chain の使い所
foo | bar | baz の場合、どれかが Runnableでないといけない
そんな時使う
まぁ間際らしいので、普通はfoo,bar,bazをRunnableLambda で取り扱うべき
RunnableLambda は with_retry とか便利メソッドが生えている
最初からこれとソース読めば手っ取り早かった感あるぞ
続いて runnables の各種コード
RunnableBranch
(条件関数, 実行) のタプルを用意してマッチしたものを実行。
なんでbranchって名前なんだろ
RunnableConfig
各種設定。callbacks / tags / max_concurrency とか
RunnableWithFallbacks
Runnableが失敗時に別のものに差し替える
with_fallbacks() で普通は利用する
RunnableWithMessageHistory
sessionごとにBaseChatMessageHistoryを管理
RunnablePassthrough
入力をそのまま出力。lambda x: x 的なidentifyに近いが、入力の値を追加するのに便利なassignが使える。
渡ってきた dict に key 追加したりするのに便利
RunnableRetry
失敗時のRetry試行。with_retry で呼び出すのが一般的
RouterRunnable
指定した key を実行
OpenAIFunctionsRouterで使っているので、みるのが手っ取り早い
utils
非同期処理系
gated_coro
asyncio.Semaphore 使ったsemaphoreでくるんで変える
gather_with_concurrency
ast 見て判定する系